package com.xxx.rpc.common.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
/**
 * 对象链
 * 
 * @author rosun
 *
 * ihavecar web server framework
 * WebSite: https://github.com/notyet/roscat
 * Licence: Apache v2 License
 */
public class Chain<E> extends ArrayList<E>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 6101751380704416936L;
	
	private Iterator<E> iterator;
	private Iterator<E> invertedIterator;

	
	/**
	 * 构造函数
	 */
	public Chain(){
	}
	
	/**
	 * 快速失败，逆序迭代
	 */
	public void rewind(){
		Collections.reverse(this);
		this.invertedIterator =  this.iterator();  
	}
	
 

 

	/**
	 * 迭代器下一个元素
	 * @return 下一个元素
	 */
	public E next(){
		if(iterator.hasNext()){
			return iterator.next();
		} else {
			return null;
		}
	}

	/**
	 * 迭代器是否有下一个对象
	 * @return 是否有下一个对象
	 */
	public boolean hasNext(){
		return iterator.hasNext();
	}

	/**
	 * 迭代器上一个元素
	 * @return 上一个元素
	 */
	public E previous(){
		if(invertedIterator.hasNext()){
			return invertedIterator.next();
		} else {
			return null;
		}
	}

	/**
	 * 迭代器是否有上一个对象
	 * @return 是否有上一个对象
	 */
	public boolean hasPrevious(){
		return invertedIterator.hasNext();
	}
	
	/**
	 *  从当前对象克隆一个 Chain
	 *  @return 克隆后的对象
	 */
	@SuppressWarnings("unchecked")
	public Chain<E> clone(){
		Chain<E> cloned = (Chain<E>) super.clone();
		
		Chain<E> chain = new Chain<E>();
		chain.addAll(cloned);
		chain.iterator = chain.iterator();
		chain.invertedIterator =  chain.iterator();  
		return chain;
	}
}
